package service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import constant.Constant;
import dao.CourseDao;
import entity.Course;
import entity.CourseType;
import exception.DataAccessException;
import exception.ServiceException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import service.CourseService;
import vo.CourseVo;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

@Service
public class CourseServiceImpl implements CourseService {

    @Autowired
    CourseDao courseDao;

    //查询所有
    @Override
    public PageInfo<Course> findAllCourse(CourseVo courseVo) {
        PageHelper.startPage(courseVo.getPageNo(), Constant.PAGE_SIZE);
        List<Course> list = courseDao.selectAll(courseVo);
        if (null == list) {
            throw new ServiceException("就这么多");
        }
        return new PageInfo<Course>(list);
    }

    //启用禁用课程的方法
    @Override
    public void changeToggleStatus(Integer id, Integer status) {
        int i = courseDao.changeToggleStatusById(id, status);
        if (i == 0) {
            throw new ServiceException("修改失败");
        }
    }

    //修改课程前的查询方法
    @Override
    public PageInfo<Course> findAllCourseB4Modify(Integer id) {
        List<Course> list = courseDao.findAllCourseB4Modify(id);
        if (null == list) {
            throw new ServiceException("就这么多");
        }
        return new PageInfo<Course>(list);
    }

    // 添加课程的
    @Override
    public void addCourse(Course c) {
        courseDao.addCourse(c);

    }

    //修改课程
    @Override
    public void modifyCourse(Course c) {
        courseDao.updateCourse(c);
    }

    //加载当前课程所在类别下点击量前三多的课程
    @Override
    public List<Course> loadRecCourse(Integer courseid) {
        List<Course> list = courseDao.findTop3Course(courseid);
        return list;
    }

    //   加载前十五条数据，推荐课程优先显示
    @Override
    public List<Course> findTop15() throws ServiceException {
//        查询所有非禁用数据，并按推荐等级排序
        List<Course> courses = new ArrayList<>();
        try {
            courses = courseDao.SelectRecommendationGrade();
//            截取前十五条信息
            if (courses.size() > 15) {
                courses = courses.subList(0, 15);
            }
            System.out.println("TOP15_size=" + courses.size());
            System.out.println(courses);
        } catch (DataAccessException e) {
            throw new ServiceException(e.getMessage());
        }
        return courses;
    }

    // 分页查询课程、按时间排序
    @Override
    public PageInfo<Course> findCourseByCourseTypeId(Integer pageNo, Integer course_type_id,
                                                     Map<Integer, List<CourseType>> direction) throws ServiceException {
        //开启分页插件的分页功能
        PageHelper.startPage(pageNo, Constant.PAGE_SIZE);

        List<Course> courses = new ArrayList<>();
        List<Integer> course_type_ids = new ArrayList<>();

        if (null == course_type_id || (0 == course_type_id && null == direction) || null == direction) {
//        方向和分类都选全部(course_type_id=0)，显示全部信息
            course_type_ids = null;
        } else if (0 == course_type_id || null != direction.get(course_type_id)) {
//        选择了顶级标题对应方向里的全部的情况
            System.out.println("选择了顶级标题=======");
            // List<CourseType>的值只有一个，取出该值
            List<CourseType> secondTypes = new ArrayList<>();
            for (List<CourseType> courseTypes : direction.values()) {
                secondTypes = courseTypes;
            }
            course_type_ids = extractCourseTypeIds(secondTypes);
            System.out.println("course_type_ids=" + course_type_ids);
        } else {
//        选了三级标题
            course_type_ids.add(course_type_id);
        }

//        根据对应情况查询数据库
        courses = courseDao.selectTimeByCourseTypeIdList(course_type_ids);
//        没有对应数据直接返回
        PageInfo<Course> info = new PageInfo<Course>(courses);
        return info;
    }

    // 所有一级标题分类下，点击量前四的课程
    @Override
    public List<CourseVo> findAllTop4(List<CourseType> courseTypes) throws ServiceException {
        System.out.println("找前四=======");
        List<CourseVo> courseVos = new ArrayList<>();
        try {
            for (int i = 0; i < courseTypes.size(); i++) {
                Integer id = courseTypes.get(i).getId();

//            提取三级标题的id
                Set<CourseType> childrens = courseTypes.get(i).getChildrens();
                List<Integer> ids = extractCourseTypeIds(new ArrayList<>(childrens));

                List<Course> courses = courseDao.SelectClickByCourseTypeIdList(ids);
//                提取点击量前四的课程
                if (courses.size() > 4) {
                    courses = courses.subList(0, 4);
                }
//            封装CourseVo
                for (int j = 0; j < courses.size(); j++) {
                    courseVos.add(new CourseVo(courses.get(j), id));
                }
            }
        } catch (DataAccessException e) {
            throw new ServiceException(e.getMessage());
        }
        System.out.println("寻找完毕=======");
        return courseVos;
    }

    //    前台查询所有课程
    @Override
    public List<Course> findAllCourseForFront() throws ServiceException {
        return courseDao.selectAllForFront();
    }

    //添加当前课程判断是否存在
    @Override
    public int queryNum(String courseName, String courseTypeId) {
        int num = courseDao.queryNum(courseName, courseTypeId);
        return num;
    }

    //查询同类别课程点击量排名前3的推荐课程
    @Override
    public List<Course> selectTop3ById(int id) throws ServiceException {
        List<Course> courses = courseDao.selectTop3ByIds(id);
        return courses;
    }

    //    在二级标题的List中提取所有三级标题的id
    private List<Integer> extractCourseTypeIds(List<CourseType> secondTypes) {
        System.out.println("开始提取三级标题的id~~~~");
//        用于存放取出的id值
        List<Integer> ids = new ArrayList<>();

//        提取所有三级标题的id
        for (int i = 0; i < secondTypes.size(); i++) {// 遍历二级标题的list
            Set<CourseType> childrens = secondTypes.get(i).getChildrens();
            for (CourseType courseType : childrens) {// 遍历三级标题的list
                ids.add(courseType.getId());
            }
        }
        System.out.println("提取三级标题的id结束******");
        return ids;
    }
}
